package czy.demo.config;


import czy.demo.common.interceptor.LogInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Mvc配置并不需要
 * @EnableWebMvc注解，而且好像默认配置也不多
 */
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {

    @Autowired
    private LogInterceptor logInterceptor;

    /**
     * 通过实现接口方法,注册拦截器,注册时使用实例,拦截器作为Bean注入
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        System.out.println("进入拦截器方法");
        /* 注册拦截器，指定拦截器实例与拦截路由的关系 */
        registry.addInterceptor(this.logInterceptor).addPathPatterns("/log/**");
    }

    /**
     * 静态资源配置，这里有两个路径：
     * 1.addResourceHandler方法添加的路径为需要作为静态资源处理的路由，如果路由匹配，则作为静态资源处理
     * 2.addResourceLocations方法添加的则是静态资源的实际位置，其中classpath:/static/代表了类路径下的目录
     * 如果是打包后的文件，可以根据类路径查找与jar包同级的路径，作为静态资源来处理，如
     * File path = null;
     * try{
     *    path = new File(ResourceUtils.getURL("classpath:").getPath());
     * }catch(Exception ex){
     *    ex.printStackTrace();
     * }
     * String staticPath=path.getParentFile().getParentFile().getParent()+File.separator+"static"+File.separator;
     * 因为jar包中的classpath的实际路径是确定的，通过查找父目录即可找到jar包所在目录
     * 这样就可以动态的将jar包外部资源作为静态资源了
     * 至于静态资源配置覆盖路由这种事，我不想测
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        System.out.println("进入资源处理器方法");
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

    /**
     * 跨域配置，解决了不同域名、端口的页面发送请求的问题
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        System.out.println("进入跨域分享方法");
        registry.addMapping("/**")
                .allowCredentials(true)
                .allowedHeaders("*")
                .allowedMethods("*")
                .allowedOrigins("*")
                .maxAge(3600L);
    }

    /**
     * 配置跨域过滤器，对OPTION请求做响应

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(3600L);
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(source);
    }
     */
}
